#ifndef MYMUDUO_HTTPSERVLET_H
#define MYMUDUO_HTTPSERVLET_H

#include <unordered_map>
#include <functional>
#include <utility>

#include "../../base/noncopyable.h"
#include "HttpServer.h"

/**
 * servletDispatch : 请求分发获取器
 *
 */
class HttpServlet : muduo::noncopyable{
public:

    /**
     * 初始化Servlet服务器
     * @param port 监听端口号
     * @param numThreads 启动的IO线程数
     * @param maxFileSize http服务器最大可读取的文件数量上限
     */
    HttpServlet(int port, int numThreads = 1, int maxFileSize = 102400);

    /**
     * 检查uri是否有对应的回调函数
     * @param uri 待获取的uri
     * @return 返回是否有对用的回调函数
     */
    bool hasCallback(const std::string & uri);

    /**
     * 注销对应的回调函数
     * @param uri 待注销的回调函数的uri
     */
    void removeCallback(const std::string & uri);

    /**
     * 注册对应的回调函数
     * @param uri
     * @param cb
     */
    void updateCallback(const std::string & uri, HttpServer::HttpCallback cb);

    /**
     * 启动http服务器
     */
    void run();

    /**
     * 返回当前的EventLoop
     * @return 返回当前的EventLoop
     */
    EventLoop *getLoop() const { return server_.getLoop(); }

    /**
     * 设置默认获取文件的目录
     * @param path 文件目录
     */
    void setFilePath(string path){
        filePath_ = std::move(path);
    }

    /**
     * 设置服务请求失败后的默认回调
     * @param cb 服务请求失败后的默认回调
     */
    void setFailCallback(HttpServer::HttpCallback cb){
        defaultHttpCallback_ = cb;
    }
private:
    /**
     * http请求分发处理器
     * @param req
     * @param resp
     */
    void doRequest(const HttpRequest & req, HttpResponse * resp);

    string filePath_;
    int maxFileSize_;

    EventLoop loop_;
    HttpServer server_;
    std::unordered_map<std::string, HttpServer::HttpCallback> data_;
    HttpServer::HttpCallback defaultHttpCallback_;
};


#endif //MYMUDUO_HTTPSERVLET_H
